# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/4 18:39 
@Author  : ZhangShenao 
@File    : basic.py 
@Desc    : 函数基础
"""


# def是可执行语句,函数直到被调用前都是不存在的
# 只有当程序调用一个函数时,def语句才会创建一个新的函数对象,并且赋予其名字
# 因此,在调用函数前,一定要确保该函数已经被定义过了

# 在函数定义之前调用,会抛出NameError
# f1()    # NameError: name 'f1' is not defined

# 在函数内部调用其他函数时,函数的定义顺序就不重要了
# 因为def是可执行语句,函数在调用前都不存在

def f1():
    print('invoke f1')

    # 在函数内部调用其他函数
    f2()


def f2():
    print('invoke f2')


# 函数可以设置默认参数
# 如果不传参,则使用默认值
# 如果对默认参数进行了传参,则会覆盖默认值
def f3(param=1):
    print(f'invoke f3, param = {param}')


# 函数的多态
# 因为Python是dynamically typed的,因此函数的参数可以传入任意类型
# 在函数体中,根据传入参数类型的不同,可以执行不同的操作,这就是多态
# 在必要时,还是需要对参数进行类型校验
def add(a, b):
    return a + b


if __name__ == '__main__':
    f1()
    f3()
    f3(2)
    print(add(1, 2))
    print(add([1, 2], [3, 4]))
